import sys
import pandas as pd
import datetime
# 导入本项目路径
sys.path.append(r"G:/Code/ac_lingxing_api/ad_ana")

from db.clickhouse_db import click_db


class aba_mon:
    def __init__(self):
        self.client = click_db()
    
    # 
    def get_kw_aba(self, keyword_lst:list, stime:str|int, etime:str|int):
        """
        从月ABA数据中,获取关键词的数据。
        @keyword_lst:关键词列表
        @stime:开始时间,格式: 20250101
        @etime:结束时间时间,格式: 20250101
        """
        # 把列表拼接成字符串查询的次数
        keyword_str = ",".join(["'" + str(kw) + "'" for kw in keyword_lst])
        sql = f"""
            select *
            from month_aba
            where stime < {etime}
            and stime >= {stime}
            and keyword in ({keyword_str})
        """
        df = self.client.read_sql(sql)
        return df
    
    def reverse_df(self, df: pd.DataFrame):
        """
        把数据库中的ABA数据转置成需要的格式。
        @df: ABA的DataFrame格式
        """
        df_lst = []
        # 根据keyword分组，然后把每组数据进行转置。生成想要的数据格式。
        for kw, df1 in df.groupby('keyword'):
            df = df1.pivot(index='keyword', columns='stime', values='rank').reset_index().rename_axis(columns=None)
            df = df[['keyword'] + sorted(df.columns[1:], key=lambda x: int(x[:-1]))]
            df_lst.append(df)
        df = pd.concat(df_lst)
        return df
    
    def main(self):
        # 获取今年的 年数据
        now_year = int(datetime.datetime.now().strftime("%Y"))
        # 去年的 年数据
        last_year = now_year-1
        # 每年的ABAdf数据
        df_year_lst = []
        for year in [last_year, now_year]:
            # 传参，每次传入关键词列表、一年的时间。根据年份拼接成 当年的年初，和下年的年初，eg：  2025年，拼接成  20250101,20260101
            df = self.get_kw_aba(['dtf powder', 'dtf printer', 'dtf'], int(str(year)+"0101"), int(str(year+1)+"0101"))
            # 取有用的三列值
            df = df[['rank', 'keyword', 'stime']]
            # 把修改数据，把20250501 拼接成  05月
            df['stime'] = df['stime'].apply(lambda df_one: str(df_one)[4:6] + "月")
            # df = df.sort_values(['keyword', 'stime'])
            # 开始转置数据
            df = self.reverse_df(df)
            # 添加一列，说明当前是那年的关键词排名
            df['year'] = str(year) + "年关键词排名"
            # 重新排列一下列顺序
            df = df[['year'] + list(df.columns[:-1])]
            df.fillna("", inplace=True)
            # print(df)
            df_year_lst.append(df)
        df_total = pd.concat(df_year_lst)
        df_total = df_total.fillna(0)
        print(df_total)
        df_total.to_excel(r"G:\Code\ac_lingxing_api\ad_ana\create_keywords/xx.xlsx")
    
am = aba_mon()
am.main()


